package com.wms.common.utils.uuid;

import java.util.concurrent.atomic.AtomicInteger;

import com.wms.common.utils.DateUtils;
import com.wms.common.utils.StringUtils;

/**
 * 序列生成类
 */
public class Seq {
    /**
     * 通用序列类型
     */
    public static final String commSeqType = "COMMON";
    /**
     * 上传序列类型
     */
    public static final String uploadSeqType = "UPLOAD";
    /**
     * 通用接口序列数
     */
    private static AtomicInteger commSeq = new AtomicInteger(1);
    /**
     * 上传接口序列数
     */
    private static AtomicInteger uploadSeq = new AtomicInteger(1);
    /**
     * 机器标识
     */
    private static String machineCode = "A";

    /**
     * 获取通用序列号
     *
     * @return
     */
    public static String getId() {
        return getId(commSeqType);
    }

    /**
     * 获取指定类型的序列号
     *
     * @param type
     * @return
     */
    public static String getId(String type) {
        AtomicInteger atomicInt = commSeq;
        if (uploadSeqType.equals(type)) {
            atomicInt = uploadSeq;
        }
        return getId(atomicInt, 3);
    }

    /**
     * 生成序列号
     *
     * @param atomicInt
     * @param length
     * @return
     */
    public static String getId(AtomicInteger atomicInt, int length) {
        String result = DateUtils.dateTimeNow();
        result += machineCode;
        result += getSeq(atomicInt, length);
        return result;
    }

    /**
     * 获取序列数
     *
     * @param atomicInt
     * @param length
     * @return
     */
    private synchronized static String getSeq(AtomicInteger atomicInt, int length) {
//        先取值再+1
        int value = atomicInt.getAndIncrement();
//        如果更新后值>=10 的 (length)幂次方则重置为1
        int maxSeq = (int) Math.pow(10, length);
        if (atomicInt.get() >= maxSeq) {
            atomicInt.set(1);
        }
//        转字符串，用0左补齐
        return StringUtils.padl(value, length);
    }
}
